package cn.wolfcode.web.interceptor;

import cn.wolfcode.domain.Employee;
import cn.wolfcode.util.RequiredPermission;
import cn.wolfcode.util.UserContext;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

public class PermissionInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException {

        // 1.获取当前登录用户的信息
        // Employee employee = (Employee)request.getSession().getAttribute("USER_IN_SESSION");
        Employee employee = UserContext.getCurrentUser();

        // 2.检查是否为 Admin, 也就是是否为超级管理员
        if (employee.isAdmin()) {
            // 2.5 如果是超级管理员 Admin, 则放行
            return true;
        }

        // 3. 如果不是超级管理员,则获取当前需要访问的控制器方法有没有贴注解
        // 3.1 先获取当前要访问的控制器中的所有方法
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        // 3.2 获取方法中贴了 权限限制注解的所有方法
        RequiredPermission annotation = handlerMethod.getMethodAnnotation(RequiredPermission.class);
        // 3.3 如果没有一个方法贴注解 也就是都不需要权限限制
        if (annotation == null) {
            // 3.4 没有需要限制的 直接放行
            return true;
        }

        // 4. 如果有方法贴了注解,表示需要拦截
        // 4.1 我们首先获取该方法的权限表达式
        String expression = annotation.expression();
        // 4.2 获取当前登录用户所拥有的权限表达式
        // List<String> permissionExpressions = (List<String>) request.getSession()
        // .getAttribute("PERMISSION_IN_SESSION");
        List<String> permissionExpressions = UserContext.getPermissionExpression();

        // 5.检查当前登录用户是否拥有该权限
        if (permissionExpressions.contains(expression)) {
            // 5.1 如果拥有该权限 放行
            return true;
        }

        // 5.2 如果没有该权限,则进行拦截
        // 因为我们需要访问错误提示信息页面,但是页面在 WEB-INF 里
        // 所以我们采用请求转发而不是重定向
        request.getRequestDispatcher("/WEB-INF/views/common/nopermission.jsp")
                .forward(request,response);
        // 6.拦截
        return false;
    }
}
